#pragma warning disable IDE0073 // The file header does not match the required text
//----------------------------------------------------------------
// Copyright (c) Microsoft Corporation.  All rights reserved.
//----------------------------------------------------------------

namespace System;

using System.Collections.Specialized;
using System.Runtime;
using System.Text;

// thin wrapper around string; use type system to help ensure we
// are doing canonicalization right/consistently
class UriTemplateLiteralQueryValue : UriTemplateQueryValue, IComparable<UriTemplateLiteralQueryValue> {
	readonly string value; // an unescaped representation

	UriTemplateLiteralQueryValue(string value)
		: base(UriTemplatePartType.Literal) {
		Fx.Assert(value != null, "bad literal value");
		this.value = value;
	}
	public static UriTemplateLiteralQueryValue CreateFromUriTemplate(string value) {
		return new UriTemplateLiteralQueryValue(UrlUtility.UrlDecode(value, Encoding.UTF8));
	}

	public string AsEscapedString() {
		return UrlUtility.UrlEncode(this.value, Encoding.UTF8);
	}
	public string AsRawUnescapedString() {
		return this.value;
	}
	public override void Bind(string keyName, string[] values, ref int valueIndex, StringBuilder query) {
		query.AppendFormat("&{0}={1}", UrlUtility.UrlEncode(keyName, Encoding.UTF8), AsEscapedString());
	}

	public int CompareTo(UriTemplateLiteralQueryValue other) {
		return string.Compare(this.value, other.value, StringComparison.Ordinal);
	}

	public override bool Equals(object obj) {
		UriTemplateLiteralQueryValue lqv = obj as UriTemplateLiteralQueryValue;
		if (lqv == null) {
			Fx.Assert("why would we ever call this?");
			return false;
		} else {
			return this.value == lqv.value;
		}
	}
	public override int GetHashCode() {
		return this.value.GetHashCode();
	}

	public override bool IsEquivalentTo(UriTemplateQueryValue other) {
		if (other == null) {
			Fx.Assert("why would we ever call this?");
			return false;
		}
		if (other.Nature != UriTemplatePartType.Literal) {
			return false;
		}
		UriTemplateLiteralQueryValue otherAsLiteral = other as UriTemplateLiteralQueryValue;
		Fx.Assert(otherAsLiteral != null, "The nature requires that this will be OK");
		return (CompareTo(otherAsLiteral) == 0);
	}
	public override void Lookup(string value, NameValueCollection boundParameters) {
		Fx.Assert(string.Compare(this.value, value, StringComparison.Ordinal) == 0, "How can that be?");
	}
}
